from redis import RedisError
from rest_framework.views import exception_handler
# 全局异常处理器，用于捕获视图函数/类中未处理的异常
from django.db import DatabaseError
# Django 数据库操作的基类异常
from rest_framework.response import Response
# DRF 统一的API响应封装
from rest_framework import status
# DRF 预定义的 HTTP 状态码常量集合

import logging
logger = logging.getLogger('django')

def custom_exception_handler(exc, context):
    # 调用drf框架原生的异常处理方法
    response = exception_handler(exc, context)
    if response is None:  # 如果原生的处理方法返回为None 则进入自定义判定异常的处理
        view = context['view'] # 这行代码的作用是从上下文中提取当前的视图对象 ， 获取视图实例
        if isinstance(exc, DatabaseError):   # 在用户的代码中，当捕获到DatabaseError时
            logger.error('mysql数据库异常！ [%s] %s' % (view,exc)) # 记录错误日志时会使用到这个视图信息
            response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

        elif isinstance(exc,RedisError):
            logger.error('redis数据库异常！[%s] %s' % (view,exc))
            response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

        elif isinstance(exc, ZeroDivisionError):
            response = Response({'message':'0不可作为除数'},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    return response